package org.luxor.commons.redis.plugin.idempotent.service;

import org.luxor.commons.redis.plugin.idempotent.exception.IdempotentException;

/**
 * 幂等控制功能核心服务
 *
 * @author Mr.Yan  @date: 2020/9/18
 */
public interface IdempotentService {

    /**
     * 生成幂等token，有效期(默认7小时)
     *
     * @param businessCode 唯一业务标识
     * @return 幂等验证token
     */
    String createToken(String businessCode);

    /**
     * 生成幂等token
     *
     * @param businessCode  唯一业务标识
     * @param expireSeconds 有效期(秒)，必须大于15分钟即
     * @return 幂等验证token
     */
    String createToken(String businessCode, int expireSeconds);

    /**
     * 注册自定义的幂等token,有效期(默认7小时)
     *
     * @param businessCode 唯一业务标识
     * @param token        全局唯一token（注意！必须确保全局唯一）
     */
    void register(String businessCode, String token);

    /**
     * 断定,不是重复执行
     *
     * @param businessCode 唯一业务标识
     * @param token        幂等token
     * @throws IdempotentException 如果验证不通，则抛出IdempotentException异常
     */
    void assertPass(String businessCode, String token) throws IdempotentException;

    /**
     * 不是重复执行吗？
     *
     * @param businessCode 唯一业务标识
     * @param token        幂等token
     * @return  boolean true-非重复执行；false-重复执行(违反原则)
     */
    boolean questionPass(String businessCode, String token);
}
